//#########################################################################
//                              WackiEngie
//           Copyright (c) 2014 Marc Wacker. All rights reserved.
//#########################################################################

#pragma once

namespace WackiEngine
{

	//Modifiers bit flags used in events
	//(Ctrl, alt, shift, command, windows etc..)
	enum Modifiers
	{
		Mod_None =	0x00,
		Mod_Shift =	0x01,
		Mod_Ctrl =	0x02,
		Mod_Alt =	0x04,
		Mod_Super =	0x08,	//windows or command key
		Mod_ShiftAlt = Mod_Shift | Mod_Alt,
		Mod_ShiftCtrl = Mod_Shift | Mod_Ctrl,
		Mod_CtrlAlt = Mod_Ctrl | Mod_Alt,
		Mod_All = Mod_Shift | Mod_Ctrl | Mod_Alt,	// note that all don't include the super key.
	};

	enum InputDeviceType
	{
		Keyboard,
		Mouse,
		Gampad,
		Count
	};

	//KeyCodes for all input states including mouse, keyboard and joystick keys
	enum KeyCode 
	{
		KC_Undefined,				 //Not assigned (never returned as the result of a keystroke).
		KC_Backspace,				 //The backspace key.
		KC_Delete,					 //The forward delete key.
		KC_Tab,					 //The tab key.
		KC_Clear,					 //The Clear key.
		KC_Enter,					 //Return key.
		KC_Pause,					 //Pause on PC machines.
		KC_Escape,					 //Escape key.
		KC_Space,					 //Space key.
		KC_Numpad0,				 //Numeric keypad 0.
		KC_Numpad1,				 //Numeric keypad 1.
		KC_Numpad2,				 //Numeric keypad 2.
		KC_Numpad3,				 //Numeric keypad 3.
		KC_Numpad4,				 //Numeric keypad 4.
		KC_Numpad5,				 //Numeric keypad 5.
		KC_Numpad6,				 //Numeric keypad 6.
		KC_Numpad7,				 //Numeric keypad 7.
		KC_Numpad8,				 //Numeric keypad 8.
		KC_Numpad9,				 //Numeric keypad 9.
		KC_NumpadPeriod,			 //Numeric keypad '.'.
		KC_NumpadDivide,			 //Numeric keypad '/'.
		KC_NumpadMultiply,			 //Numeric keypad '*'.
		KC_NumpadMinus,			 //Numeric keypad '-'.
		KC_NumpadPlus,				 //Numeric keypad '+'.
		KC_NumpadEnter,			 //Numeric keypad enter.
		KC_NumpadEquals,			 //Numeric keypad '='.
		KC_UpArrow,				 //Up arrow key.
		KC_DownArrow,				 //Down arrow key.
		KC_RightArrow,				 //Right arrow key.
		KC_LeftArrow,				 //Left arrow key.
		KC_Insert,					 //Insert key key.
		KC_Home,					 //Home key.
		KC_End,					 //End key.
		KC_PageUp,					 //Page up.
		KC_PageDown,				 //Page down.
		KC_F1,						 //F1 function key.
		KC_F2,						 //F2 function key.
		KC_F3,						 //F3 function key.
		KC_F4,						 //F4 function key.
		KC_F5,						 //F5 function key.
		KC_F6,						 //F6 function key.
		KC_F7,						 //F7 function key.
		KC_F8,						 //F8 function key.
		KC_F9,						 //F9 function key.
		KC_F10,					 //F10 function key.
		KC_F11,					 //F11 function key.
		KC_F12,					 //F12 function key.
		KC_F13,					 //F13 function key.
		KC_F14,					 //F14 function key.
		KC_F15,					 //F15 function key.
		KC_0,						 //The '0' key on the top of the alphanumeric keyboard.
		KC_1,						 //The '1' key on the top of the alphanumeric keyboard.
		KC_2,						 //The '2' key on the top of the alphanumeric keyboard.
		KC_3,						 //The '3' key on the top of the alphanumeric keyboard.
		KC_4,						 //The '4' key on the top of the alphanumeric keyboard.
		KC_5,						 //The '5' key on the top of the alphanumeric keyboard.
		KC_6,						 //The '6' key on the top of the alphanumeric keyboard.
		KC_7,						 //The '7' key on the top of the alphanumeric keyboard.
		KC_8,						 //The '8' key on the top of the alphanumeric keyboard.
		KC_9,						 //The '9' key on the top of the alphanumeric keyboard.
		KC_Exclaim,				 //Exclamation mark key '!'.
		KC_DoubleQuote,			 //Double quote key '"'.
		KC_Hash,					 //Hash key '#'.
		KC_Dollar,					 //Dollar sign key '$'.
		KC_Ampersand,				 //Ampersand key '&'.
		KC_Apostrophe,				 //Quote key '.
		KC_LeftParen,				 //Left Parenthesis key '('.
		KC_RightParen,				 //Right Parenthesis key ')'.
		KC_Asterisk,				 //Asterisk key '*'.
		KC_Plus,					 //Plus key '+'.
		KC_Comma,					 //Comma ',' key.
		KC_Minus,					 //Minus '-' key.
		KC_Period,					 //Period '.' key.
		KC_Slash,					 //Slash '/' key.
		KC_Colon,					 //Colon ':' key.
		KC_Semicolon,				 //Semicolon ';' key.
		KC_Less,					 //Less than '<' key.
		KC_Equals,					 //Equals '=' key.
		KC_Greater,				 //Greater than '>' key.
		KC_Question,				 //Question mark '?' key.
		KC_At,						 //At key '@'.
		KC_LeftBracket,			 //Left square bracket key '['.
		KC_Backslash,				 //Backslash key '\'.
		KC_RightBracket,			 //Right square bracket key ']'.
		KC_Caret,					 //Caret key '^'.
		KC_Underscore,				 //Underscore '_' key.
		KC_BackQuote,				 //Back quote key '`'.
		KC_A,						 //'a' key.
		KC_B,						 //'b' key.
		KC_C,						 //'c' key.
		KC_D,						 //'d' key.
		KC_E,						 //'e' key.
		KC_F,						 //'f' key.
		KC_G,						 //'g' key.
		KC_H,						 //'h' key.
		KC_I,						 //'i' key.
		KC_J,						 //'j' key.
		KC_K,						 //'k' key.
		KC_L,						 //'l' key.
		KC_M,						 //'m' key.
		KC_N,						 //'n' key.
		KC_O,						 //'o' key.
		KC_P,						 //'p' key.
		KC_Q,						 //'q' key.
		KC_R,						//'r' key.
		KC_S,						 //'s' key.
		KC_T,						 //'t' key.
		KC_U,						 //'u' key.
		KC_V,						 //'v' key.
		KC_W,						 //'w' key.
		KC_X,						 //'x' key.
		KC_Y,						 //'y' key.
		KC_Z,						 //'z' key.
		KC_Numlock,				 //Numlock key.
		KC_CapsLock,				 //Capslock key.
		KC_ScrollLock,				 //Scroll lock key.
		KC_RightShift,				 //Right shift key.
		KC_LeftShift,				 //Left shift key.
		KC_RightControl,			 //Right Control key.
		KC_LeftControl,			 //Left Control key.
		KC_RightAlt,				 //Right Alt key.
		KC_LeftAlt,				 //Left Alt key.
		KC_LeftCommand,			 //Left Command key.
		KC_RightCommand,			 //Right Command key.
		KC_AltGr,					 //Alt Gr key.
		KC_Help,					 //Help key.
		KC_Print,					 //Print key.
		KC_SysReq,					 //Sys Req key.
		KC_Break,					 //Break key.
		KC_Menu,					 //Menu key.

		//mouse axes
		KC_Mouse_X,					//mouse X
		KC_Mouse_Y,
		KC_Mouse_WheelX,
		KC_Mouse_WheelY,


		//mouse buttons
		KC_Mouse_Left,
		KC_Mouse_Right,
		KC_Mouse_Middle,
		KC_Mouse_Btn4,
		KC_Mouse_Btn5,
		KC_Mouse_Btn6,
		KC_Mouse_Btn7,
		KC_Mouse_Btn8,
		KC_Mouse_Btn9,
		KC_Mouse_Btn10,
		KC_Mouse_Btn11,
		KC_Mouse_Btn12,
		KC_Mouse_Btn13,
		KC_Mouse_Btn14,
		KC_Mouse_Btn15,
		KC_Mouse_Btn16,
		KC_Mouse_Btn17,
		KC_Mouse_Btn18,
		KC_Mouse_Btn19,
		KC_Mouse_Btn20,
		KC_Mouse_Btn21,
		
		//mouse wheel virtual key codes for key emulation
		KC_Mouse_WheelUp,
		KC_Mouse_WheelDown,
		KC_Mouse_WheelLeft,
		KC_Mouse_WheelRight,

		// Gamepad axes
		KC_Gamepad_LeftX,				 //Gamepad left analog stick X
		KC_Gamepad_LeftY,				 //Gamepad left analog stick Y
		KC_Gamepad_RightX,				 //Gamepad right analog stick X
		KC_Gamepad_RightY,				 //Gamepad right analog stick Y
		KC_Gamepad_LeftTriggerAxis,		 //Gamepad left trigger
		KC_Gamepad_RightTriggerAxis,	 //Gamepad right trigger


		// Gamepad buttons
		KC_Gamepad_LeftThumbstick,		 //Gamepad left thumbstick press down
		KC_Gamepad_RightThumbstick,		 //Gamepad right thumbstick press down
		KC_Gamepad_SpecialLeft,			 //Gamepad special button left
		KC_Gamepad_SpecialRight,		 //Gamepad special button right
		KC_Gamepad_FaceButtonBottom,	 //Gamepad face buttons (example: X, Y, A, B on xbox)
		KC_Gamepad_FaceButtonRight,		 
		KC_Gamepad_FaceButtonTop,		 
		KC_Gamepad_FaceButtonLeft,		 
		KC_Gamepad_LeftShoulder,		 //Gamepad left shoulder button
		KC_Gamepad_RightShoulder,		 //Gamepad right shoulder button
		KC_Gamepad_LeftTrigger,			 //Gamepad left trigger
		KC_Gamepad_RightTrigger,		 //Gamepad right trigger
		KC_Gamepad_DPadUp,				 //Gamepad DPad up
		KC_Gamepad_DPadDown,			 //Gamepad DPad down
		KC_Gamepad_DPadLeft,			 //Gamepad DPad left
		KC_Gamepad_DPadRight,			 //Gamepad DPad right


		//virtual key codes used for input axis button press/release emulation
		KC_Gamepad_LeftStickUp,			 //Gamepad left stick up as binary input (triggered above a certain threshold)
		KC_Gamepad_LeftStickDown,		 //Gamepad left stick down
		KC_Gamepad_LeftStickLeft,		 //Gamepad left stick left
		KC_Gamepad_LeftStickRight,		 //Gamepad left stick right
		KC_Gamepad_RightStickUp,		 //Gamepad right stick up
		KC_Gamepad_RightStickDown,		 //Gamepad right stick down
		KC_Gamepad_RightStickLeft,		 //Gamepad right stick left
		KC_Gamepad_RightStickRight,		 //Gamepad right stick right


		KC_Count,	//number of possible keys
	};

}